home *** CD-ROM | disk | FTP | other *** search
- ;***************************************************************************
- ; YAIP
- ; Yet Another (pseudoIntelligent!!!) Patcher
- ; Written by Oskar Nurb, 14-4-97
- ; oskar_nurb@nym.alias.net
- ;
- ; GREETZ: +ORC, +Gthorne, Fravia+ and all the readers of RevEngE
- ;
- ; Please improve and expread this program. I consider I must learn a lot
- ; before making good software... I'm on the commercial standards now! :)
- ;
- ; Yeah, I can see your faces... You are surely thinking: Another patcher?
- ; Yes, but this patcher is written in ASM, and it isn't based on the file
- ; offset method that most pathers out there use. It searches and patches.
- ; There is a BIG difference between both metods. Using this code you crack
- ; several versions of a program :)
- ;
- ; As it is written in ASM, you can generate a .COM and encrypt it as you
- ; wish. Or you can just build a C program that uses this code.
- ;
- ; Enjoy!
- ;
- ;***************************************************************************
-
- .286
- .model small
- .code
- org 100h
-
- bufsize equ 20000
- CR equ 0dh
- LF equ 0ah
-
- ; As usual, some directives.
-
-
- start:
- push cs
- pop ds
- mov ax,3d02h
- mov dx,offset fname
- int 21h
-
- ; Please chech HelpPc for a refference if you are a newbye.
-
- jc Erroropening
- mov word ptr cs:[Fhandle],ax
- jmp prinbuc
-
- ; I love to write odd modules :)
- ; Why can't you see any procs? Because I wrote this in order to
- ; be heavily compiler-encrypted... And I thought it would be a
- ; mess otherwise.
-
- Erroropening:
- mov dx,offset eamsg
- mov ah,09
- int 21h
-
- ; Don't you think I'm a very user-friendly programmer?
-
- mov ah,4ch
- int 21h
-
-
- ; Here starts the search engine. You only have to put that
- ; search string in little bytes. Or even better, you can
- ; write a function that only needs a string as arg.
-
- ;All the jc stuff is there in order to left the read proc
- ;as free as possible. If you don't like it, just modify it.
- ;I personally don't care.
-
- searchbuc:
- call read
- jc finalox
- prinbuc:
- cmp ah,54h
- jne searchbuc
- call read
- jc finalox
- cmp ah,75h
- jne prinbuc
- call read
- jc finalox
- cmp ah,72h
- jne prinbuc
- call read
- jc finalox
- cmp ah,62h
- jne prinbuc
-
- ;Bingo. If you are here, you've found the match.
-
- ;Let's take our File Pointer
-
- mov ax,4201h
- mov bx,word ptr cs:[Fhandle]
- mov cx,0
- mov dx,0
- int 21h
-
- ;Let's manage it to point the start of string.
-
- mov bx,word ptr cs:[Fhandle]
- mov cx,dx
- mov dx,ax
- sub dx,word ptr cs:[Inbuf]
- add dx,word ptr cs:[readed]
- sub dx,3
- mov ax,4200h
- int 21h
-
- ;Let's write the patch
-
- mov bx,word ptr cs:[Fhandle]
- mov ah,40h
- mov cx,3
- push cs
- pop ds
- mov dx,offset wbuff
- int 21h
-
-
- ;Close file
-
-
- mov bx,word ptr cs:[Fhandle]
- mov ah,3eh
- int 21h
-
- ;Bye dear user!
-
- mov dx,offset hecho
- mov ah,09
- int 21h
-
- mov ah,4ch
- int 21h
-
- wbuff db 90h,90h,90h
- hecho db 'OK!!$'
-
- finalox:
- mov ah,4ch
- int 21h
-
- ; This is our read function, with a little buffer, of course.
- ; It is free of internal weird/end jumps for easy modification
- ; pourposes. It just returns CF on EOF, and if not CF the next byte of the
- ; file (stream??) in AH. You can surely write it better, but, hey,
- ; I'm not a programmer! :)
- ; May be some day... :)
-
- read:
- push si
- mov si,word ptr cs:[readed]
- cmp si,word ptr cs:[Inbuf]
- jne cont
- call fullbuf
- jnc cont
- pop si
- stc
- ret
- cont:
- clc
- mov ah,byte ptr cs:[Buff+si]
- inc word ptr cs:[readed]
- pop si
- clc
- ret
-
- fullbuf:
- mov bx,word ptr cs:[Fhandle]
- mov ah,3fh
- mov cx,bufsize
- push cs
- pop ds
- mov dx,offset Buff
- int 21h
- jc error
- cmp ax,0
- je error
- mov word ptr cs:[Inbuf],ax
- mov word ptr cs:[readed],0
- clc
- ret
- error:
- stc
- ret
-
-
- fname db 'test.exe',0
- eamsg db 'Error opening file',CR,LF,'$'
-
- readed dw 0
- Fhandle dw ?
- Inbuf dw ?
- Buff dw bufsize dup(?)
-
- end start
-